home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / python2.4 / longintrepr.h < prev    next >
Encoding:
C/C++ Source or Header  |  2005-10-18  |  2.1 KB  |  64 lines

  1. #ifndef Py_LONGINTREPR_H
  2. #define Py_LONGINTREPR_H
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6.  
  7.  
  8. /* This is published for the benefit of "friend" marshal.c only. */
  9.  
  10. /* Parameters of the long integer representation.
  11.    These shouldn't have to be changed as C should guarantee that a short
  12.    contains at least 16 bits, but it's made changeable anyway.
  13.    Note: 'digit' should be able to hold 2*MASK+1, and 'twodigits'
  14.    should be able to hold the intermediate results in 'mul'
  15.    (at most (BASE-1)*(2*BASE+1) == MASK*(2*MASK+3)).
  16.    Also, x_sub assumes that 'digit' is an unsigned type, and overflow
  17.    is handled by taking the result mod 2**N for some N > SHIFT.
  18.    And, at some places it is assumed that MASK fits in an int, as well.
  19.    long_pow() requires that SHIFT be divisible by 5. */
  20.  
  21. typedef unsigned short digit;
  22. typedef unsigned int wdigit; /* digit widened to parameter size */
  23. #define BASE_TWODIGITS_TYPE long
  24. typedef unsigned BASE_TWODIGITS_TYPE twodigits;
  25. typedef BASE_TWODIGITS_TYPE stwodigits; /* signed variant of twodigits */
  26.  
  27. #define SHIFT    15
  28. #define BASE    ((digit)1 << SHIFT)
  29. #define MASK    ((int)(BASE - 1))
  30.  
  31. #if SHIFT % 5 != 0
  32. #error "longobject.c requires that SHIFT be divisible by 5"
  33. #endif
  34.  
  35. /* Long integer representation.
  36.    The absolute value of a number is equal to
  37.        SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
  38.    Negative numbers are represented with ob_size < 0;
  39.    zero is represented by ob_size == 0.
  40.    In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
  41.    digit) is never zero.  Also, in all cases, for all valid i,
  42.        0 <= ob_digit[i] <= MASK.
  43.    The allocation function takes care of allocating extra memory
  44.    so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
  45.  
  46.    CAUTION:  Generic code manipulating subtypes of PyVarObject has to
  47.    aware that longs abuse  ob_size's sign bit.
  48. */
  49.  
  50. struct _longobject {
  51.     PyObject_VAR_HEAD
  52.     digit ob_digit[1];
  53. };
  54.  
  55. PyAPI_FUNC(PyLongObject *) _PyLong_New(int);
  56.  
  57. /* Return a copy of src. */
  58. PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src);
  59.  
  60. #ifdef __cplusplus
  61. }
  62. #endif
  63. #endif /* !Py_LONGINTREPR_H */
  64.